package me.zhangjin.lucene.demo.queries;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import me.zhangjin.lucene.demo.ik.IKAnalyzer6x;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.classic.QueryParser.Operator;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;


public class QueryParseTest {

    public static void main(String[] args) throws ParseException, IOException {

        Path indexPath = Paths.get("indexdir/index");
        Directory dir = FSDirectory.open(indexPath);

        // 通过指定的 Directory
        // 创建一个 IndexReader
        IndexReader reader = DirectoryReader.open(dir);

        // 首先实例化一个 IndexSearcher
        // 它的构造函数需要一个 IndexReader
        IndexSearcher searcher = new IndexSearcher(reader);

        // 创建一个 IK 分词器
        Analyzer analyzer = new IKAnalyzer6x(true);

        // 创建一个 QueryParser
        // 用它对输入的文本进行一定的分析和处理后，才能传给 IndexSearcher 进行查询
        // 它需要指定查询的字段和关联一个分词器
        // 此处的 title 表示默认查询 Term 的字段
        QueryParser parser = new QueryParser("title", analyzer);
        // 设置默认位 AND 条件
        parser.setDefaultOperator(Operator.AND);

        // 将输入的文本，通过 QueryParser 解析后
        // 得到一个 Query 对象
        // 分词后，此处的条件就是 农村+学生
        Query query = parser.parse("农村学生");
        // Query:+title:农村 +title:学生
        System.out.println("Query:" + query.toString());

        // 传递 Query 对象
        // 调用 search 方法进行查询
        // 返回的是一个 TopDocs 对象（集合）
        TopDocs tds = searcher.search(query, 10);

        // 遍历集合，返回每个 ScoreDoc
        for (ScoreDoc sd : tds.scoreDocs) {
            // Explanation explanation = searcher.explain(query, sd.doc);
            // System.out.println("explain:" + explanation + "\n");

            // 根据 docId，获得对应的 Document
            Document doc = searcher.doc(sd.doc);

            System.out.println("DocID:" + sd.doc);
            System.out.println("文档评分:" + sd.score);

            // Document 里面的每一列都可以通过索引方式查询出来
            System.out.println("id:" + doc.get("id"));
            System.out.println("title:" + doc.get("title"));

        }

        dir.close();
        reader.close();
    }
}
